跳到主要内容

3.10实验十 数码管

3.10.1 实验目的

(1)熟悉和掌握FPGA开发流程和Lattice Diamond软件使用方法;

(2)通过实验理解和掌握数码管驱动;

(3)学习用Verilog HDL描述数码管驱动电路。

3.10.2 实验任务

在数码管上显示数字

3.10.3 实验原理

数码管是工程设计中使用很广的一种显示输出器件。一个7段数码管(如果包括右下的小点可以认为是8段)分别由a、b、c、d、e、f、g位段和表示小数点的dp位段组成。实际是由8个LED灯组成的,控制每个LED的点亮或熄灭实现数字显示。通常数码管分为共阳极数码管和共阴极数码管,结构如下图所示:

alt text

共阴8段数码管的信号端低电平有效,而共阳端接高电平有效。当共阳端接高电平时只要在各个位段上加上相应的低电平信号就可以使相应的位段发光。比如:要使a段发光,则在a段信号端加上低电平即可。共阴极的数码管则相反。 可以看到数码管的控制和LED的控制有相似之处,在小脚丫STEP-MXO2 V2开发板上有两位共阴极数码管:

alt text

数码管所有的信号都连接到FPGA的管脚,作为输出信号控制。FPGA只要输出这些信号就能够控制数码管的那一段LED亮或者灭。这样我们可以通过开关来控制FPGA的输出,和3. 3-8译码器实验一样,通过组合逻辑的输出来控制数码管显示数字,下面是数码管显示的表格

alt text

这其实是一个4-16译码器,如果我们想数码管能显示16进制可以全译码,如果只想显示数字,可以只利用其中10个译码

3.10.4 Verilog HDL建模描述

数码管驱动清单segment.v

module segment
(
input wire [3:0] seg_data_1, //四位输入数据信号
input wire [3:0] seg_data_2, //四位输入数据信号
output wire [8:0] segment_led_1, //数码管1,MSB~LSB = SEG,DP,G,F,E,D,C,B,A
output wire [8:0] segment_led_2 //数码管2,MSB~LSB = SEG,DP,G,F,E,D,C,B,A
);

reg[8:0] seg [15:0]; //存储7段数码管译码数据
initial
begin
seg[0] = 9'h3f; // 0
seg[1] = 9'h06; // 1
seg[2] = 9'h5b; // 2
seg[3] = 9'h4f; // 3
seg[4] = 9'h66; // 4
seg[5] = 9'h6d; // 5
seg[6] = 9'h7d; // 6
seg[7] = 9'h07; // 7
seg[8] = 9'h7f; // 8
seg[9] = 9'h6f; // 9
seg[10]= 9'h77; // A
seg[11]= 9'h7C; // b
seg[12]= 9'h39; // C
seg[13]= 9'h5e; // d
seg[14]= 9'h79; // E
seg[15]= 9'h71; // F
end

assign segment_led_1 = seg[seg_data_1];
assign segment_led_2 = seg[seg_data_2];
endmodule

3.10.5 实验步骤

1.打开Lattice Diamond,建立工程。

2.新建Verilog HDL设计文件,并键入设计代码。

3.综合并分配管脚,输入信号连接到开关和按键,输出信号接到数码管引脚。

seg_data_1(0)M7seg_data_2(0)L14
seg_data_1(1)M8seg_data_2(1)M13
seg_data_1(2)M9seg_data_2(2)M14
seg_data_1(3)M10seg_data_2(3)N14
seg_led_1(0)A10seg_led_2(0)C12
seg_led_1(1)C11seg_led_2(1)B14
seg_led_1(2)F2seg_led_2(2)J1
seg_led_1(3)E1seg_led_2(3)H1
seg_led_1(4)E2seg_led_2(4)H2
seg_led_1(5)A9seg_led_2(5)B12
seg_led_1(6)B9seg_led_2(6)A11
seg_led_1(7)F1seg_led_2(7)K1
seg_led_1(8)C9seg_led_2(8)A12

4.构建并输出编程文件,烧写至FPGA的Flash之中。

5.通过按键或者开关来控制相应的数码管显示数字